iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 13
0

Access Control 的用意是限制外部 module 或 source file 對你所寫的程式碼存取,目的是隱藏部分程式碼的細節來達到安全性。 module 及 source file 兩者解釋如下:
Module :
一個 bundle ID 下的 app 或者 app 內 import 的 framework 都可稱為一個 module。
Source Files :
每一個 .swift 檔案。

Access Control 影響的範圍包含以下三個部分了:

  1. module 和 module 間。
  2. module 和 source file 間。
  3. source file 和 source file 間。

在 Swift 中可分為 5 個層級。層級最高到最低依次為 open / public / internal / file-private / private。層級最高表示限制最少,反之表示限制最多。
1.open:
只用於 class 宣告以及 class 內所有的成員宣告。所有 module 和 source file 都可取得,可讓繼承者繼承此 class 和 override 此 class 內的 method。
2.public:
不限用於 class,所有 module 和 source file 都可取得。但若為 class,則繼承者不可繼承此 class 和override 其 method。
3.internal:
宣告於 module 內所有 source file 才可取得,於 module 外無法取得。module 內所有source file,若為class,可讓繼承者繼承此 class 和 override 此 class 內的 method。同時,此為預設的 access control,也就代表預設的存取權限只能用於你寫的 module 內,在 module 外無法取得。
4.fileprivate:
宣告的 source file 內才可取得,若為 class,可讓繼承者繼承此 class 和 override 此 class 內的 method。
5.private :
宣告的區塊內才可取得,也就是大括號內才可取得。若為 class,可讓繼承者繼承此 class 和 override 此 class內的 method。

使用方法:

public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}

範例:
class:

public class SomePublicClass { // explicitly public class
  public var somePublicProperty = 0 // explicitly public class member
  var someInternalProperty = 0 // implicitly internal class member
  fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
  private func somePrivateMethod() {} // explicitly private class member
}

function:

private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
  // function implementation goes here
}

Enumeration Types:

public enum CompassPoint {
  case north
  case south
  case east
  case west
}

Subclassing:

public class A {
  fileprivate func someMethod() {}
}

internal class B: A {
  override internal func someMethod() {}
}

上一篇
iOS App 實作(10)Parsing data form API
下一篇
iOS App 實作(11)音樂播放(AVAudioPlayer)
系列文
30天Swift入門學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言